Skip to content

在 Go 语言中,makenew是两个用于分配内存的内置函数,但它们的用途和行为有着明显的区别:

1、new

new(T)为任意类型分配零值内存,并返回其地址,即一个*T类型的值。它仅分配内存,不初始化内存,所分配的内存被初始化为类型的零值。

go
num := new(int) // 分配内存,*num 初始化为 0

使用 new 基础类型后可以直接使用,使用 new 切片等引用类型后需要额外的初始化

2、make

make仅用于切片(slice)、映射(map)和通道(channel)这三种引用类型的内存分配和初始化。make(T, args)返回初始化后的(非零)值,而不是指针。对于切片,make还可以接受长度和容量参数。

go
s := make([]int, 10) // 创建一个长度为 10 的切片,元素初始化为 0

3、两者的区别

特性newmake
返回类型指针(*T引用类型的实例(如slicemapchannel
用途为类型分配零值内存分配并初始化切片、映射、通道
初始化分配的内存被初始化为零值分配的内存被初始化为非零值
适用类型任何类型仅限切片、映射、通道

在实际使用中,选择new还是make通常取决于你需要的是指针还是已初始化的引用类型。

木川工作室 (微信:mcmc2024)